package Reflection;
/**
 * 反射: 通过反射可以获取类的信息, 并且可以动态创建对象, 调用方法, 访问属性;
   Class类: 反射的基础, 所有类的Class对象都可以通过Class类的静态方法forName()获取;
   getClass()方法: 获取对象的Class对象;
   instanceof不但匹配指定类型还匹配指定类型的子类，用==判断class实例可以精确地判断数据类型，但不能作子类型比较。

*/

public class ClassDemo {
    public static void main(String[] args) {
        // 1. 获取类的Class对象
        String str = "Hello World";
        Class cls = str.getClass();
        Class cls2 = String.class;
        System.out.println(cls == cls2); // true
        System.out.println(cls);

        // 2. 通过Class类的静态方法forName()获取Class对象
        try {
            Class cls3 = Class.forName("java.lang.String");
            System.out.println(cls3 == cls); // true
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        Compare c = new Compare();
        c.compare();

        // 3. 获取类的信息
        printClassInfo(cls);
    }
    /**
     类的相关信息
        getName()：获取类的全名
        getSimpleName()：获取类的简称
        getCanonicalName()：获取类的规范名
        isInterface()：判断是否是接口
        isArray()：判断是否是数组
        isPrimitive()：判断是否是基本类型
        getSuperclass()：获取父类
        getInterfaces()：获取接口
     */
    static void printClassInfo(Class cls) {
        System.out.println("Class Name: " + cls.getName());
        System.out.println("Simple Name: " + cls.getSimpleName());
        System.out.println("Canonical Name: " + cls.getCanonicalName());
        System.out.println("Is Interface: " + cls.isInterface());
        System.out.println("Is Array: " + cls.isArray());
        System.out.println("Is Primitive: " + cls.isPrimitive());
        System.out.println("Superclass: " + cls.getSuperclass());
        System.out.println("Interfaces: " + cls.getInterfaces());
    } 
}

class Compare {
    private Integer n = new Integer(10);
    public void compare() {
        boolean b1 = n instanceof Integer; // true，因为n是Integer类型
        boolean b2 = n instanceof Number;  // true，因为n是Number类型的子类
        boolean b3 = n instanceof Object;

        boolean b4 = n.getClass() == Integer.class;
        // boolean b5 = n.getClass() == Number.class;
        System.out.println("b1 = "+ b1);
        System.out.println("b2 = "+ b2);
        System.out.println("b3 = "+ b3);
        System.out.println("b4 = "+ b4);
        // System.out.println("b5 = "+ b5); // 编译错误，因为n是Integer类型，不能转换为Number类型
        System.out.println(Number.class);
        System.out.println(n.getClass());
    }
}